package com.example.util;

import android.util.Log;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created with IntelliJ IDEA.
 * User: Jasic
 * Date: 12-11-27
 */
public class FileUtil {

    private FileUtil() {
    }

    /**
     * 创建文件
     *
     * @param fileName
     *
     * @return
     *
     * @throws IOException
     */
    public static boolean createFile(String fileName) throws IOException {

        File file = new File(fileName);
        return createFile(file);
    }

    /**
     * 创建文件
     *
     * @param fileName
     *
     * @return
     *
     * @throws IOException
     */
    public static boolean createFile(File file) throws IOException {

        File parent = file.getParentFile();
        parent.mkdirs();
//System.out.println("---------> 文件:[" + file.getAbsolutePath() +"]" + (file.exists()? "已" : "未") +"存在");
        file.delete();
        if (!file.createNewFile()) {

            System.out.println("文件[" + file.getAbsolutePath() + "]不能被新建，可能存在，但没删除重建权限....");
            return false;
        }

        return true;
    }


    /**
     * 向文件添加内容
     * -1：表示不成功
     * 0～n：表示添加的长度
     *
     * @param temp
     *
     * @return
     */
    public static long appedContent(File file, byte[] temp) throws IOException {

        if(null == temp || temp.length==0){
            Log.i("INFO", "被入的字节数组无效果，下载失败...");
            return -1;
        }

        if (!file.exists()) {
            Log.i("INFO", "文件[" + file + "]不存在");
            return -1;
        }

        if (!file.canWrite()) {

            Log.i("INFO", "文件[" + file + "]不能被写入");
            return -1;
        }


        RandomAccessFile f = new RandomAccessFile(file, "rwd");
        long oldLength = f.length();
        f.seek(oldLength);
        f.write(temp);

        long result = f.length() - oldLength;
        f.close();
        return result;
    }

    /**
     * 过滤出指定后缀的文件
     *
     * @param postFix
     *
     * @return
     */
    public static List<File> filter(final File directory, final String postFix) {

        /**
         * 获取过滤的file
         */
        List<File> fileList = getAllFiles(directory, false, true);

        Iterator<File> iterator = fileList.iterator();
        while(iterator.hasNext()){

            String name = iterator.next().getName();
            if (name.endsWith(postFix)){
                continue;
            }
            iterator.remove();
        }
        return  fileList;
    }

    /**
     * 获取目录下所有文件
     *
     * @param file
     * @param includedDir  是否包含目录名
     * @param recursiveDir 是递归子目录
     *
     * @return
     */
    public static List<File> getAllFiles(File dir, boolean includedDir, boolean recursiveDir) {

        List<File> files = new ArrayList<File>();

        if (!dir.isDirectory()) {

            return files;
        }

        File[] fileList = dir.listFiles();

        /**
         * 循环当前文件夹
         */
        for (File file : fileList) {

            /**
             * 目录
             */
            if (file.isDirectory()) {

                /**
                 * 如果需要则添加目录名
                 */
                if (includedDir) {
                    files.add(file);
                }

                /**
                 * 递归
                 */
                if (recursiveDir) {
                    files.addAll(getAllFiles(file, includedDir, recursiveDir));
                }

            }

            /**
             * 如果是文件直接添加
             */
            else if (file.isFile()) {
                files.add(file);

//                System.out.println("====" + file.getName());
            }
        }

        return files;
    }

//    public static void main(String[] args) {
//
//        for(File file : filter(new File("C:/test"),".mp3")){
//
//            System.out.println("------------->fileName:"  + file);
//        }
//    }
}
